perm filename SGRIND.LSP[SCH,LSP]  blob 
sn#688843 filedate 1982-11-14 generic text, type T, neo UTF8
 
;;;-*-LISP-*-
;;;; SCHEME sprint package.
(defmacro stringp (object)
  `(and (atom ,object) (< (flatc ,object) (flatsize ,object))))
;;; Display functions:
(defun into fexpr (all-three) ;moves a property from one to another
  (putprop (car all-three)
	   (car (remprop (cadr all-three)
			 (caddr all-three)))
	   (caddr all-three)))
(into oprin1 prin1 lsubr)
(defun prin1 (obj)
  (cond (*display-flag*
	 (princ obj))
	(t (oprin1 obj))))
(into oflatsize flatsize subr)
(defun flatsize (obj)
  (cond (*display-flag*
	 (flatc obj))
	(t (oflatsize obj))))
(declare (special *formals* *bodies* *terse?* *noprint* nn
		  linel *rset nouuo *display-flag* *last-indented*))
(setq *terse?* t)
(setq *bodies* nil)
(setq *formals* nil)
(setq *display-flag* nil)
(setq *last-indented* 1)
(include "<scheme.development>Lgrind.lsp")
(into oturpri turpri subr)
(defun turpri ()
  (setq *last-indented* nn)
  (oturpri))
(setq grind-standard-quote nil)
;;; User interface
(defun jinx-print (l)
  (let ((*bodies* nil)
	(*formals* nil)
	(linel (grlinel))
	(*rset grind*rset)
	(hunksprin1 'scheme-hunksprin1)
	(nouuo grind*rset)
	(nn (grlinel))
	(*last-indented* (grlinel)))
    (terpri)
    (sprint l linel 0.)
    (terpri)
    *noprint*))
(defun jinx-pp (object)
  (jinx-print (list '*no-terse* object)))
(defun display objects
  (jinx-print
   (list '*print-sequence*
	 (mapcar #'(lambda (x)
		     (if (stringp x)
			 (list '*display* x)
			 x))
		 (listify objects)))))
(defun display-messages objects
  (jinx-print
   (list '*print-sequence* (reverse (disp-1 (listify objects) nil)))))
(defun disp-1 (objects so-far)
  (if (null objects) so-far
      (disp-1 (cddr objects)
	      (cons (if (null (cdr objects))
			(list '*display* (car objects))
			(list '*print-sequence*
			      (list (list '*display* (car objects))
				    (cadr objects))))
		    so-far))))
(defun highlight (pointer object)
  (jinx-pp (subst `(*highlight* ,pointer) pointer object)))
;;; Unsyntaxing of bodies will occur only once.
(defmacro my-sch-procedure-body (proc)
  `(let ((found (assq ,proc *bodies*)))
     (cond ((null found)
	    (cdar (setq *bodies*
			(cons
			 (cons ,proc (sch-procedure-body ,proc)) *bodies*))))
	   (t (cdr found)))))
(defmacro my-sch-procedure-formals (proc)
  `(let ((found (assq ,proc *formals*)))
    (cond ((null found)
	   (cdar
	    (setq *formals*
		  (cons
		   (cons ,proc
			 (formals (sch-procedure-formals ,proc)
				  (sch-procedure-name ,proc))) *formals*))))
	  (t (cdr found)))))
  
(defun formals (args name)
  (if (null name) args
       (cons name args)))
;;;; Scheme special-form grinding
;;; Defines, lambdas and lets
(defun define-form ()  ;Two cases of define.
  (cond ((atom (cadr l))
	 (setq-form))
	(t (sch-lambda-form))))
(grindfn define define-form)
(defun sch-lambda-form () ;l n m free
  (princ (car l))
  (print-body l (cadr l) (cddr l) n m '/))
  (setq l nil))  ;sprint1 tests on return for nil l.
  
(grindfn (lambda let) sch-lambda-form) ;lambda and let like define.
;;;; Quoted grinding: don't print quote-mark if string
(defun (quote grindmacro) ()
  (cond ((stringp (cadr l))
	 (prin1 (cadr l)))
	(t (princ '/')
	   (sprint1 (cadr l) (grchrct) m)))
  t) ;sprint1 tests for value returned and if nil, proceeds as if list.
(defun (quote grindflatsize) (object)
  (cond ((stringp (cadr object))
	 (flatsize (cadr object)))
	(t (1+ (gflatsize (cadr object))))))
;;; Highlighted expressions
(defun (*highlight* grindmacro) ()
  (let ((q (grchrct)))
    (let ((n (cond ((and (> (- linel q) 3) (= q *last-indented*))
		    (do ((i 1 (1+ i))) ((> i 4) q) (princ (ascii 8.))))
		   ((= q *last-indented*)
		    (- q 4))
		   (t (indent-to (setq q (min (+ q 4) linel)))
		      (- q 4)))))
      (princ "*-> ")
      (sprint1 (cadr l) n (+ 4 m))
      (princ " <-*"))
    t))
(defun (*highlight* grindflatsize) (object)
  (+ 8. (gflatsize (cadr object))))
;;; Displayed expressions
(defun (*display* grindmacro) ()
  (let ((*display-flag* t))
    (sprint1 (cadr l) n m)
    t))
(defun (*display* grindflatsize) (object)
  (let ((*display-flag* t))
    (gflatsize (cadr object))))
(defun (*print-sequence* grindmacro) ()
  (print-sequence (cadr l) (cadr l) n m 0)
  t)
(defun (*print-sequence* grindflatsize) (object)
  (body-flatsize (cadr object)))
;;; Pretty-printed expressions
(defun (*no-terse* grindmacro) ()
  (let ((*terse?* nil))
    (sprint1 (cadr l) n m)
    t))
(defun (*no-terse* grindflatsize) (object)
  (let ((*terse?* nil))
    (gflatsize (cadr object))))
;;;; Data driven Scheme objects grinding.
(defun scheme-hunksprin1 (l n m)
  (funcall (get (primitive-type l) 'sch-pretty-print) l n m))
(defun (scheme-hunksprin1 hunkgflatsize) (x)
  (funcall (get (primitive-type x) 'sch-flatsize) x))
;;; Formatting of primitive-procedures.
(defun (primitive-procedure sch-pretty-print) (object left pars)
  (princ "[PRIMITIVE ")
  (princ (sch-procedure-name object))
  (princ "]"))
(defun (primitive-procedure sch-flatsize) (x)
  (+ 12. (flatc (sch-procedure-name x))))
;;; Formatting of compound-procedures.
(defun (compound-procedure sch-pretty-print) (object left pars)
  (let ((nam (sch-procedure-name object)))
    (cond ((null nam)
	   (princ "[LAMBDA-PROCEDURE "))
	  (t (princ "[PROCEDURE ")))
    (cond (*terse?*
	   (cond ((null nam) (princ (maknum object)))
		 (t (princ nam)))
	   (princ "]"))
	  (t (print-body object
			 (my-sch-procedure-formals object)
			 (my-sch-procedure-body object) left pars '/])))))
(defun (compound-procedure sch-flatsize) (proc)
  (let ((nam (sch-procedure-name proc))
	(tot 11.))
    (cond (*terse?*
	   (if (null nam)
	       (+ 7. tot (1+ (flatc (maknum proc))))
	       (+ 1 (flatc nam) tot)))
	  (t (+ tot
		(proc-flatsize (my-sch-procedure-formals proc)
			       (my-sch-procedure-body proc)))))))
(defun print-body (object formals body left pars closing-char)
  (princ " ")
  (sprint1 formals (grchrct) 1)
  (princ " ")
  (print-sequence object body left pars 3.)
  (princ closing-char)
  t)
(defun print-sequence (object body left pars indent)
  (cond ((< (gflatsize object) (- left pars))
	 (map #'(lambda (x) (sprint1 (car x) (grchrct) 1)
			(cond ((cdr x) (princ " "))))
	      body))
	(t (map
	    #'(lambda (x)
		(cond ((cdr x)
		       (sprint1 (car x) (- left indent) 0))
		      (t (sprint1 (car x)
				  (- left indent) (+ pars 1)))))
	    body)))
  t)
(defun proc-flatsize (formals body) ;doesn't include pars.
  (+ 2. (gflatsize formals) 
     (body-flatsize body)))
(defun body-flatsize (body)
  (+ -1. (length body)
     (apply (function +)
	    (mapcar (function gflatsize) body))))))
;;; Formatting of arrays
(defun (array sch-pretty-print) (object left pars)
  (princ "[ARRAY ")
  (princ (maknum object))
  (if *terse?*
      (princ "]")
      (sprint1 (scharraydims object)
	       (cond ((< (gflatsize object) (- left pars))
		      (1+ (grchrct)))
		     (t (- left 3)))
	       (+ pars 1))
      (princ "]")))
(defun (array sch-flatsize) (arr)
  (+ 8. (flatc (maknum arr))
     (if *terse?* 0 (1+ (gflatsize (scharraydims arr))))))
;;; Formatting of environments
(defun (environment sch-pretty-print) (object left pars)
  (princ "[ENVIRONMENT ")
  (princ (maknum object))
  (princ "]"))
(defun (environment sch-flatsize) (env)
  (+ 14. (flatc (maknum env))))
;;; Formatting of unidentified objects
(defun (unidentified-object sch-pretty-print) (object left pars)
  (princ "[RANDOM←OBJECT ")
  (princ (maknum object))
  (princ "]"))
(defun (unidentified-object sch-flatsize) (obj)
  (+ 16. (flatc (maknum obj))))